#include <iostream>
#include <stack>

// 两个栈实现一个队列
// 两个栈不可能同时有数据（宗旨）
class MyQueue
{
public:
    MyQueue() {}

    // 入栈
    void Push(int value)
    {
        while (s2.empty() == false)
        {
            // 先获取s2栈顶元素的值，压入s1中，再把s2的栈顶元素弹出（相当于先拷贝一份）
            s1.push(s2.top());
            s2.pop();
        }
        s1.push(value);
    }

    // 出栈
    void Pop()
    {
        while (s1.empty() == false)
        {
            s2.push(s1.top());
            s1.pop();
        }
        s2.pop();
    }

    // 两个栈都没数据时为空
    bool IsEmpty()
    {
        return s1.empty() && s2.empty();
    }

    // 获取栈顶元素
    int GetFront()
    {
        while (s1.empty() == false)
        {
            s2.push(s1.top());
            s1.pop();
        }
        return s2.top();
    }

private:
    std::stack<int> s1; // 放数据的时候只有s1有数据
    std::stack<int> s2; // 出数据的时候只有s2有数据
};

int main()
{
    MyQueue q;
    q.Push(1);
    q.Push(2);
    q.Push(3);
    q.Push(4);
    std::cout << q.GetFront() << std::endl;
    q.Push(5);
    q.Pop();
    std::cout << q.GetFront() << std::endl;

    return 0;
}